package com.wzy.lombok;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;

import com.sun.istack.internal.NotNull;

import lombok.AccessLevel;
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.NonNull;
import lombok.Setter;
import lombok.ToString;
import lombok.val;

/**
 * Lombok的实现原理
 * <p>
 * 注解的两种解析方式
 * 运行时解析 ： 导致运行效率低下
 * <p>
 * 编译时解析： lombok运行在编译时,所以在引入依赖时可以： <scope>provided</scope>
 */
public class Demo
{

}

class GetterDemo
{
	@Getter(lazy = true)
	// lazy 会使该变量进行懒加载，只有当get方法被调用的时候才会去触发
	private final String STR = "hello,word";

	@Getter(
			value = AccessLevel.PRIVATE, // 生成的get方法是私有的
			onMethod_ = {@NotNull})// 生成的get上会有@Notnull注解
	private String filed;
}

class SetterDemo
{
	@Setter
	private String field1;

	@Setter(value = AccessLevel.PRIVATE,
			onMethod_ = {@NotNull})
	private String field2;
}

// 会给类生成默认的toString方法 ，打印类名+字段名+属性值
@ToString(includeFieldNames = false, // toString不包含字段名，默认是包含
		// exclude = {"field1"},//toString排除 field1字段
		of = {"field1"}, //必须包含field1，这个优先级大于exclude，exclude将被忽略，其实两者互斥
		callSuper = true,// toString包含父类的字段，默认为false
		doNotUseGetters = true // 表示不使用get方法获取属性
)
class ToStringDemo
{
	private String field1;

	private String field2;
}

/**
 * @Val 弱语言变量
 */
class ValDemo
{
	public ValDemo()
	{
		val str = "hhh";
	}
}

/**
 * 可以生成非空的检查
 */
class NonNullDemo
{
	// 如果 传递的参数为null则会抛出空指针异常
	public NonNullDemo(@NonNull String field)
	{
		System.out.println(field);
	}
}

@AllArgsConstructor
@NoArgsConstructor
// @RequiredArgsConstructor // 如果字段为final或者有NonNull注解，那么会为这些不能为空的字段生成必要的构造方法
class ConstructorDemo
{
	private String field1;

	private String field2;
}

/**
 * cleanup可以自动生成对相关资源关闭的方法
 */
class CleanUpDemo
{
	public void copy()
	{
		// 会生成try catch finally释放资源
		try
		{
			FileInputStream fileInputStream = new FileInputStream(new File("xxx.txt"));
		}
		catch (FileNotFoundException e)
		{
			e.printStackTrace();
		}
	}
}